package math;

import org.junit.Test;

/**
 * @Description 263. 丑数
 * @Author Firenut
 * @Date 2023-01-14 00:26
 */
public class T263_isUgly {
    @Test
    public void test() {
        System.out.println(isUgly(4));
    }

    // 一个合数最终可以被拆成n个质数相乘
    // 12是丑数，因为 12 = 2*6 = 2*3*2
    // 如果一个数是丑数,使用2、3、5不断进行除法运算，最终得到的值必定为1
    public boolean isUgly(int n) {
        if (n <= 0) {
            return false;
        }
        int[] factors = {2, 3, 5};
        for (int factor : factors) {
            while (n % factor == 0) {
                n /= factor;
            }
        }
        return n == 1;
    }

    //优化:除2、模2运算都可以用位运算来提高性能
    public boolean isUgly1(int n) {
        if (n <= 0) {
            return false;
        }
        int[] factors = {3, 5};
        for (int factor : factors) {
            while (n % factor == 0) {
                n /= factor;
            }
        }
        while ((n & 1) == 0) { //如果n是偶数,那么二进制的最低位必定是0；如果n是奇数，最低为必定是1
            n >>= 1;
        }

        return n == 1;
    }
}
